package com.halfsword.creativecraft.datagen;

import com.halfsword.creativecraft.CreativeCraft;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.PackOutput;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.data.event.GatherDataEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

import java.util.concurrent.CompletableFuture;

/**
 * 数据生成器主类 - DeepSeek 提供核心注释
 *
 * <p>本类负责协调和组织模组的所有数据生成任务：</p>
 * <ul>
 *   <li>服务端数据：配方、战利品表、标签等</li>
 *   <li>客户端数据：模型、状态等</li>
 *   <li>全局数据：战利品修改器、兴趣点标签等</li>
 * </ul>
 *
 * <p>设计特点：</p>
 * <ol>
 *   <li>模块化：每个数据提供器独立完成特定任务</li>
 *   <li>高效性：并行处理数据生成任务</li>
 *   <li>兼容性：支持Minecraft最新数据生成系统</li>
 * </ol>
 */
@Mod.EventBusSubscriber(modid = CreativeCraft.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class DataGenerators {

    /**
     * 数据收集事件处理器 - DeepSeek 注释
     *
     * <p>当Forge初始化数据生成系统时调用此方法：</p>
     * <ul>
     *   <li>注册所有数据提供器</li>
     *   <li>区分服务端和客户端数据</li>
     *   <li>处理数据依赖关系</li>
     * </ul>
     *
     * @param event 数据收集事件
     */
    @SubscribeEvent
    public static void gatherData(GatherDataEvent event) {
        // 核心组件初始化 - DeepSeek 注释
        DataGenerator generator = event.getGenerator(); // 数据生成器实例
        PackOutput packOutput = generator.getPackOutput(); // 数据包输出路径
        ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); // 文件验证助手
        CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider(); // 注册表访问器

        // ==================== 服务端数据提供器 ==================== //
        // 配方生成器 - 定义模组合成配方 - DeepSeek 注释
        generator.addProvider(event.includeServer(), new SpaceRecipeProvider(packOutput));

        // 战利品表生成器 - 定义方块掉落规则 - DeepSeek 注释
        generator.addProvider(event.includeServer(), SpaceLootTableProvider.create(packOutput));

        // 方块标签生成器 - 定义方块分类标签 - DeepSeek 注释
        BlockTagGenerator blockTagGenerator = generator.addProvider(event.includeServer(),
                new BlockTagGenerator(packOutput, lookupProvider, existingFileHelper));

        // 物品标签生成器 - 依赖方块标签数据 - DeepSeek 注释
        generator.addProvider(event.includeServer(),
                new ItemTagGenerator(packOutput, lookupProvider, blockTagGenerator.contentsGetter(), existingFileHelper));

        // 全局战利品修改器 - 修改原版战利品表 - DeepSeek 注释
        generator.addProvider(event.includeServer(), new GlobalLootModifiersProvider(packOutput));

        // 兴趣点标签生成器 - 定义村民职业相关位置 - DeepSeek 注释
        generator.addProvider(event.includeServer(),
                new PoiTypeTagsProviders(packOutput, lookupProvider, existingFileHelper));

        // ==================== 客户端数据提供器 ==================== //
        // 方块状态生成器 - 定义方块模型和状态 - DeepSeek 注释
        generator.addProvider(event.includeClient(),
                new SpaceBlockStateProvider(packOutput, existingFileHelper));

        // 物品模型生成器 - 定义物品渲染模型 - DeepSeek 注释
        generator.addProvider(event.includeClient(),
                new SpaceItemModelProvider(packOutput, existingFileHelper));
    }
}